/*
 * MIT许可证
 *
 * 版权所有 (c) 2025-2035 JacobGreen
 *
 * 特此免费授予获得本软件及相关文档文件（"软件"）副本的任何人不受限制地处置该软件的权利，
 * 包括不限于使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本，
 * 以及允许被提供该软件的人这样做，须遵守以下条件：
 *
 * 上述版权声明和本许可声明应包含在该软件的所有副本或实质性部分中。
 *
 * 本软件按"原样"提供，不附带任何形式的明示或暗示的保证，
 * 包括但不限于对适销性、特定用途适用性和不侵权的保证。
 * 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他
 * 责任负责，无论是在合同行为、侵权行为或其他方面，
 * 与软件或软件的使用或其他交易有关。
 */

/**
 * filename:mainTest.c
 * description:是所有单元测试程序的入口
 */
#include "LogTest.h"
#include "ArrayListTest.h"
#include <stdio.h>
#include <stdbool.h>

/**
 * <p>
 * 测试程序入口
 * </p>
 *
 * @param argc 参数数量
 * @param argv 参数列表(字符串)
 */
int main(int argc, char *argv[])
{
    // 所有单元测试通过
    bool allTestsPassed = false;

    printf("========================================\n");
    printf("============= C Core 测试 ==============\n");
    printf("========================================\n\n");

    // 从命令行参数设置日志合并模式（必须在logInit之前调用）
    setLogMergeFromArgs(argc, argv);

    // 初始化日志系统
    if (!logInit())
    {
        printf("[INFO] [测试程序] [日志] - mainTest.c - 日志系统初始化失败。\n");
        fprintf(stderr, "[ERROR] 日志系统初始化失败。\n");
        return -1;
    }
    printf("[INFO] [测试程序] [日志] - mainTest.c - 日志系统初始化成功。\n");

    // 从命令行参数设置日志级别
    setLogLevelFromArgs(argc, argv);

    LOG_INFO("测试程序", "开始", "========================================");
    LOG_INFO("测试程序", "开始", "============= C Core 测试 ==============");
    LOG_INFO("测试程序", "开始", "========================================");

    printf("========================================\n");
    printf("============  ArrayList测试开始  ========\n");
    printf("========================================\n");
    LOG_INFO("测试程序", "数组表", "=======================================");
    LOG_INFO("测试程序", "数组表", "===========  ArrayList测试开始  ========");
    LOG_INFO("测试程序", "数组表", "=======================================");

    // ArrayListTest.h中的arrayListUnitTest函数执行ArrayList的单元测试
    allTestsPassed = arrayListUnitTest();

    printf("========================================\n");
    printf("============  ArrayList测试结束  ========\n");
    printf("========================================\n\n");
    LOG_INFO("测试程序", "数组表", "=======================================");
    LOG_INFO("测试程序", "数组表", "===========  ArrayList测试结束  ========");
    LOG_INFO("测试程序", "数组表", "=======================================");

    printf("[INFO] [测试程序] [统计] - mainTest.c - 所有测试是否通过: %s\n", allTestsPassed ? "是" : "否");
    LOG_INFO("测试程序", "统计", "所有测试是否通过: %s", allTestsPassed ? "是" : "否");

    printf("\n========================================\n");
    printf("============ C Core 测试结束 ============\n");
    printf("========================================\n");
    LOG_INFO("测试程序", "结束", "========================================");
    LOG_INFO("测试程序", "结束", "============ C Core 测试结束 ============");
    LOG_INFO("测试程序", "结束", "========================================");

    // 关闭日志系统
    logClose();

    return allTestsPassed ? 0 : -1;
}